package control.recipe;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.renderable.ParameterBlock;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.imageio.ImageIO;
import javax.media.jai.JAI;
import javax.media.jai.RenderedOp;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import model.member.MemberVO;
import model.recipe.FavoriteVO;
import model.recipe.RecipeDescVO;
import model.recipe.RecipeGradeVO;
import model.recipe.RecipeReplyVO;
import model.recipe.RecipeService;
import model.recipe.RecipeVO;
import model.recipe.exception.DuplicateWriteException;
import model.recipe.exception.NotFoundRecipeException;
import model.recipe.paging.BBom_ListVO;
import model.recipe.paging.CommonConstants;
import model.recipe.paging.ListVO;
import model.recipe.paging.Reply_ListVO;

import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class RecipeContoller extends MultiActionController {

	private RecipeService service;
	int order = 1;
	ArrayList<RecipeDescVO> rdList = new ArrayList<RecipeDescVO>();
	// 4page 에 처음 접속하면 1페이지라는 것을 보여준다.
	private String tempPath = "C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp";
	private String imgPath = "C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\upload\\img";

	public RecipeContoller() {
		super();
	}

	public RecipeContoller(RecipeService service) {
		super();
		this.service = service;
	}

	// 최초 1~4page 까지의 데이터 공유하는 페이지
	public ModelAndView writeNext(HttpServletRequest request,HttpServletResponse response, HttpSession session, RecipeVO vo) throws SQLException {
		// page 구분하기 위해 받아온다
		String page = request.getParameter("page");
		String user = request.getParameter("user");
		// return 주소를 저장하는 변수
		String path = "redirect:index";
	
		if ("a".equals(user)) {
			SimpleDateFormat valueFormat = new SimpleDateFormat("yyyy-MM-dd");
			String r_date = valueFormat.format(new Date().getTime());
			try {
				service.getTodayCheckByAdmin(r_date);
			} catch (DuplicateWriteException e) {
				return new ModelAndView("errorPage.error");
			}
		}
		
		if ("1".equals(page)) {
			path = "write1.recipe";
			// write1 page에서 넘어온값 1
		} else if ("2".equals(page)) {
			session.setAttribute("recipe1", vo);
			path = "write2.recipe";
			// write2 page에서 넘어온값 2
		} else if ("3".equals(page)) {
			String r_category = request.getParameter("r_category");
			String r_nara = request.getParameter("r_nara");
			vo.setR_type(r_category + r_nara);
			session.setAttribute("recipe2", vo);
			// if(session.getAttribute(""))
			path = "write3.recipe";
			// write3 page에서 넘어온값 3
		} else if ("4".equals(page)) {
			session.setAttribute("recipe3", vo);
			path = "write4.recipe";
			// write4 page에서 넘어온값 4
		}
	
		return new ModelAndView(path, "order", order);
	}

	public ModelAndView writePrev(HttpServletRequest request,
			HttpServletResponse response) {
		String page = request.getParameter("page");
		String path = "";
		if ("1".equals(page)) {
			path = "write1.recipe";
		} else if ("2".equals(page)) {
			path = "write2.recipe";
		} else if ("3".equals(page)) {
			path = "write3.recipe";
		}
		return new ModelAndView(path);
	}
	
	// 4page이상부터 recipeDescVO 에서 다음 페이지로 가기위해서 만든 메서드
	public ModelAndView writeDescNext(HttpServletRequest request,
			HttpServletResponse response, HttpSession session) {
		RecipeDescVO rdvo = null;
		if ("true".equals(request.getParameter("isNewPage"))) {
			// next버튼을 누를시 마다 새로운 recipeDescVO 객체가 필요하다.
			rdvo = new RecipeDescVO();
			// recipeDescVO 값 setting
			rdvo.setR_order(order);
			rdvo.setR_subject(request.getParameter("r_subject"));
			rdvo.setR_content(request.getParameter("r_content"));

			rdvo.setR_img_origin(request.getParameter("r_img_origin"));
			rdvo.setR_img_new(request.getParameter("r_img_new"));
			rdvo.setR_img_thum(request.getParameter("r_img_thum"));
			// recipeDescVO 를 List에 담아 session에 저장한다.
			rdList.add(rdvo);
			session.setAttribute("recipeD", rdList);
			order++;

		} else if ("false".equals(request.getParameter("isNewPage"))) {
			rdvo = new RecipeDescVO();
			rdvo.setR_order(order);
			rdvo.setR_subject(request.getParameter("r_subject"));
			rdvo.setR_content(request.getParameter("r_content"));
			rdvo.setR_img_origin(request.getParameter("r_img_origin"));
			rdvo.setR_img_new(request.getParameter("r_img_new"));
			rdvo.setR_img_thum(request.getParameter("r_img_thum"));
			rdList.set(order - 1, rdvo);
			session.setAttribute("recipeD", rdList);
			order++;
		}
		request.setAttribute("orderSize", rdList.size());

		// 새로운 order를 가지고 간다.
		return new ModelAndView("write4.recipe", "order", order);
	}

	// recipeDescVO 에서 이전 페이지로 가기위해서 만든 메서드
	public ModelAndView writeDescPrev(HttpServletRequest request,
			HttpServletResponse response, HttpSession session) {
		// 이전 페이지로 가기위해 order-1 값을 전송해준다
		order = order - 1;
		request.setAttribute("orderSize", rdList.size());
		return new ModelAndView("write4.recipe", "order", order);
	}

	public ModelAndView write_submit(HttpServletRequest request,
			HttpServletResponse response, HttpSession session) {
		// 각각의 session에서 받아온 내용을 하나의 recipeVO의 session에 통합해준다
		RecipeVO rvo1 = (RecipeVO) session.getAttribute("recipe1"); // 1page
		RecipeVO rvo2 = (RecipeVO) session.getAttribute("recipe2"); // 2page
		RecipeVO rvo3 = (RecipeVO) session.getAttribute("recipe3"); // 3page
		RecipeVO vo = new RecipeVO(); // 통합용
		vo.setR_title(rvo1.getR_title());
		vo.setR_comment(rvo1.getR_comment());
		vo.setR_img_origin(rvo1.getR_img_origin());
		vo.setR_img_new(rvo1.getR_img_new());
		vo.setR_img_thum(rvo1.getR_img_thum());
		vo.setR_type(rvo2.getR_type());
		vo.setR_mcnt(rvo3.getR_mcnt());
		vo.setR_main_ingre(rvo3.getR_main_ingre());
		vo.setR_sub_ingre(rvo3.getR_sub_ingre());
		// 하나의 세션으로 통합했으니, 각각페이지의 세션은 없애줌.
		session.removeAttribute("recipe1");
		session.removeAttribute("recipe2");
		session.removeAttribute("recipe3");

		Map map = (Map) session.getAttribute("loginMember"); // 로그인된 세션으로 관리자 or사용자인지구분.
		MemberVO mvo = (MemberVO) map.get("mvoLogin");
		vo.setR_user(mvo.getM_type()); // 관리자 or 사용자인지 확인.
		vo.setR_writer(mvo.getM_name()); // 로그인된 세션에 있는 사용자를 작성자에 넣는다.
		vo.setM_id(mvo.getM_id());
		// 작성완료 눌렀을 때의 페이지에 있는 정보를 parameter값으로 가져온다.
		String r_subject = request.getParameter("r_subject");
		String r_content = request.getParameter("r_content");
		String r_img_origin = request.getParameter("r_img_origin");
		String r_img_new = request.getParameter("r_img_new");
		String r_img_thum = request.getParameter("r_img_thum");

		// 작성 완료 시 해당 페이지가 작성되지 않았을 경우
		if (r_subject.equals("")) {
			try {
				List list = (List) session.getAttribute("recipeD");
				service.write(vo, list);

				// 이미지 저장 폴더로 이동
				moveFile(session, vo.getR_img_new());
				moveFile(session, vo.getR_img_thum());
				moveFile(session, vo.getR_img_origin());
				for (int i = 0; i < list.size(); i++) {
					RecipeDescVO rvo = (RecipeDescVO) list.get(i);
					moveFile(session, rvo.getR_img_new());
					moveFile(session, rvo.getR_img_thum());
					moveFile(session, rvo.getR_img_origin());
				}

				// 작성시 사용했던 session을 없애준다.
				session.removeAttribute("recipeD");
				order = 1;
				rdList.clear();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 작성 완료 시 해당 페이지가 작성된 경우
		} else {
			RecipeDescVO rdvo = new RecipeDescVO();
			rdvo.setR_subject(r_subject);
			rdvo.setR_content(r_content);
			rdvo.setR_order(order);
			rdvo.setR_img_origin(r_img_origin);
			rdvo.setR_img_new(r_img_new);
			rdvo.setR_img_thum(r_img_thum);
			rdList.add(rdvo);
			session.setAttribute("recipeD", rdList);
			List list = (List) session.getAttribute("recipeD");
			// DB insert
			try {
				service.write(vo, list);

				// 이미지 저장 폴더로 이동
				moveFile(session, vo.getR_img_new());
				moveFile(session, vo.getR_img_thum());
				moveFile(session, vo.getR_img_origin());
				for (int i = 0; i < list.size(); i++) {
					RecipeDescVO rvo = (RecipeDescVO) list.get(i);
					moveFile(session, rvo.getR_img_new());
					moveFile(session, rvo.getR_img_thum());
					moveFile(session, rvo.getR_img_origin());
				}
				session.removeAttribute("recipeD");
				order = 1;
				rdList.clear();
			} catch (SQLException e) {
				e.printStackTrace();
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return new ModelAndView("redirect:/index.jsp");
	}

	// 작성 취소 메서드
	public ModelAndView write_cancle(HttpServletRequest request,
			HttpServletResponse response, HttpSession session) {
		session.removeAttribute("recipe1");
		session.removeAttribute("recipe2");
		session.removeAttribute("recipe3");
		session.removeAttribute("recipeD");
		order = 1;
		rdList.clear();
		return new ModelAndView("index");
	}

	// 뽐내기 게시판 음식 종류에 따라서 정렬해준다.
	public ModelAndView bbom(HttpServletRequest request,
			HttpServletResponse response) throws SQLException {
		String page = request.getParameter("page");
		String r_type = "";
		if ("1".equals(page)) {
			r_type = "1";
		} else if ("2".equals(page)) {
			r_type = "4";
		} else if ("3".equals(page)) {
			r_type = "3";
		} else if ("4".equals(page)) {
			r_type = "2";
		} else if ("5".equals(page)) {
			r_type = "a";
		} else if ("6".equals(page)) {
			r_type = "b";
		} else if ("7".equals(page)) {
			r_type = "c";
		} else if ("8".equals(page)) {
			r_type = "d";
		} else if ("9".equals(page)) {
			r_type = "e";
		} else if ("10".equals(page)) {
			r_type = "f";
		} else if ("11".equals(page)) {
			r_type = "g";
		} else if ("12".equals(page)) {
			r_type = "h";
		}
		String Pagingpage = request.getParameter("pageNo");
		ListVO listvo = service.getbbomListKind(Pagingpage, r_type);
		return new ModelAndView("userList.recipe", "userListByRecipe", listvo);
	}

	// 검색 조건 을 분류하기 위한 메서드
	public ModelAndView search(HttpServletRequest request,
			HttpServletResponse response) throws SQLException {
		String page = request.getParameter("page");
		String r_type="";
		
		if ("2".equals(page)) {
			r_type = "1";
		} else if ("3".equals(page)) {
			r_type = "4";
		} else if ("4".equals(page)) {
			r_type = "3";
		} else if ("5".equals(page)) {
			r_type = "2";
		} else if ("6".equals(page)) {
			r_type = "a";
		} else if ("7".equals(page)) {
			r_type = "b";
		} else if ("8".equals(page)) {
			r_type = "c";
		} else if ("9".equals(page)) {
			r_type = "d";
		} else if ("10".equals(page)) {
			r_type = "e";
		} else if ("11".equals(page)) {
			r_type = "f";
		} else if ("12".equals(page)) {
			r_type = "g";
		} else if ("13".equals(page)) {
			r_type = "h";
		}
		String s_order = "r_no";
		HashMap map = service.searchByRecipeKind(r_type);
		map.put("r_type", r_type);
		map.put("s_order", s_order);
		return new ModelAndView("search.search", "searchRecipeList", map);
	}
	public ModelAndView bbomListBySearchWord(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)
			throws SQLException {
		String page = request.getParameter("pageNo");
		String r_type = request.getParameter("r_type");		//검색 분류(한식,양식,etc..)
		String s_word = request.getParameter("s_txt");		//검색어
		String s_type = request.getParameter("s_type");		//검색 방법
		String s_order = request.getParameter("s_order");	//정렬 기준
		String ss_order= "r."+s_order;
		HashMap smap = new HashMap();
		smap.put("r_type", r_type);
		smap.put("word", s_word);
		smap.put("s_type", s_type);
		smap.put("s_order", s_order);
		smap.put("ss_order", ss_order);
		smap.put("r_type",r_type);
		smap.put("page", page);
		System.out.println("r_type?????어디???"+smap);
		System.out.println(smap);
		BBom_ListVO listvo=service.bbomListBySearchWord(smap);
		return new ModelAndView("userListBySearchWord.recipe","userListByRecipe",listvo);
	}
	
	//레시피 검색_서브메뉴
	public ModelAndView searchListByWord(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws SQLException{
		String r_type = request.getParameter("r_type");		//검색 분류(한식,양식,etc..)
		String s_word = request.getParameter("s_txt");		//검색어
		String s_type = request.getParameter("s_type");		//검색 방법
		String s_order = request.getParameter("s_order");	//정렬 기준
		String ss_order= "r."+s_order;
		HashMap smap = new HashMap();
		smap.put("r_type", r_type);
		smap.put("word", s_word);
		smap.put("s_type", s_type);
		smap.put("s_order", s_order);
		smap.put("ss_order", ss_order);
		System.out.println(smap);
		HashMap map = service.searchListByWord(smap);
		return new ModelAndView("search.search","searchRecipeList",map);
	}

	public ModelAndView bbomListBySearch(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)throws SQLException {
		String s_word = request.getParameter("s_txt");		//검색어
		String s_type = request.getParameter("s_type");		//검색 방법
		String s_order = request.getParameter("s_order"); //분류
		System.out.println(s_word+" "+s_type+" "+s_order);
		String page = request.getParameter("pageNo");
		HashMap smap = new HashMap();
		smap.put("s_type", s_type);
		smap.put("word", s_word);
		smap.put("s_order", s_order);
		smap.put("ss_order", "r."+s_order);
		smap.put("page", page);
		System.out.println(smap);
		//menu에서 클릭시에는 null값이 체크되므로.......
		//NullPointException 방지하기위해서 사용
		BBom_ListVO listvo = service.userListByRecipeBySearch(smap);
		System.out.println(listvo);
		return new ModelAndView("userListBySearch.recipe", "userListByRecipe", listvo);
	}

	//레시피 검색_전체
	public ModelAndView searchList(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)
			throws SQLException {
		String s_word = request.getParameter("s_txt");		//검색어
		String s_type = request.getParameter("s_type");		//검색 방법
		String s_order = request.getParameter("s_order");	//정렬 기준
		//레시피 검색 첫화면용
		if(s_word==null){
			s_word = "";
		}
		if(s_type==null){
			s_type = "";
		}
		HashMap smap = new HashMap();
		smap.put("s_word", s_word);
		smap.put("s_type", s_type);
		smap.put("s_order", s_order);
		HashMap map = service.searchByRecipe(smap);

		map.put("r_type", "all");
		map.put("s_txt", s_word);
		map.put("s_type", s_type);
		return new ModelAndView("search.search", "searchRecipeList", map);
	}//searchList


	 // 이미지 리사이징 메서드
	 private String resizeImg(String fileUrl, String fileName, int wantWidth,
	   int wantHeight, String str) throws IOException {
	  ParameterBlock pb = new ParameterBlock();
	  pb.add(fileUrl + File.separator + fileName);
	  int width = 0; // 최종 가로길이 변수
	  int height = 0; // 최종 세로길이 변수
	  // 이미지 객체 생성
	  RenderedOp rOp = JAI.create("fileload", pb);
	  float imgWidth = rOp.getWidth(); // 이미지객체 가로길이
	  float imgHeight = rOp.getHeight(); // 이미지객체 세로길이
	  
	  //기준 사이즈와 실제 이미지 사이즈를 비교해서 리사이징 값을 정한다.
	  String base = "";
	  // 가로, 세로 중 기준 결정
	  if ((imgWidth / wantWidth) > (imgHeight / wantHeight)) {
	   base = "width";
	  } else {
	   base = "height";
	  }
	  // 결정된 기준을 바탕으로 리사이징
	  if ("width".equals(base)) {
	   width = Math.round(imgWidth * (wantWidth / imgWidth));
	   height = Math.round(imgHeight * (wantWidth / imgWidth));
	  } else {
	   width = Math.round(imgWidth * (wantHeight / imgHeight));
	   height = Math.round(imgHeight * (wantHeight / imgHeight));
	  }
	  
	  BufferedImage bi = rOp.getAsBufferedImage();
	  BufferedImage thumb = new BufferedImage(width, height,
	    BufferedImage.TYPE_INT_RGB);
	  Graphics2D g = thumb.createGraphics();
	  g.drawImage(bi, 0, 0, width, height, null);

	  // 파일명 만들기, 이미지 폴더로 복사
	  String[] name = fileName.split("[.]");
	  fileName = "";
	  for (int i = 0; i < name.length; i++) {
	   if (i == name.length - 2) {
	    fileName += name[i] + "_" + str + ".";
	   } else {
	    fileName += name[i];
	   }
	  }
	  File file = new File(fileUrl + File.separator + fileName);
	  ImageIO.write(thumb, "jpg", file);
	  return fileName;
	 }// resizeImg

	// 파일이동
	public void moveFile(HttpSession session, String fileName)
			throws IllegalStateException, IOException {
		// 원본 경로
		File file1 = new File(tempPath + File.separator + fileName);
		// 이동할 경로
		File file2 = new File(imgPath + File.separator + fileName);

		// 원본 파일이 있으면 이동 경로로 이동
		if (file1.exists()) {
			boolean b = file1.renameTo(file2);
			// 파일 이동에 실패하면
			if (b == false) {
				// 복사한다.
				FileInputStream fis = new FileInputStream(file1);
				FileOutputStream fos = new FileOutputStream(file2);
				int data = 0;
				while (true) {
					data = fis.read();
					if (data == -1) {
						break;
					}
					fos.write(data);
				}// while
				fis.close();
				fos.close();
			}// if
		}// if
	}// moveFile

	// 임시이미지 업로드
	public ModelAndView tempFileUpload(HttpServletRequest request,
			HttpServletResponse response, RecipeVO vo) {
		// 업로드된 MultipartFile 객체
		MultipartFile file = vo.getR_uploadFile();
		// 원본파일 이름 구하기
		String r_img_origin = file.getOriginalFilename();
		// 업로드 시간+원본파일 이름으로 새 이름 생성
		String newFileName = System.currentTimeMillis() + "_" + r_img_origin;
		// 패스 추가한 경로를 파일 객체에 저장
		File copyFile = new File(tempPath + File.separator + newFileName);
		// 상세보기 페이지 이미지 이름 생성
		String r_img_new = "";
		// 섬네일 이미지 이름 생성
		String r_img_thum = "";
		try {
			// 해당 경로로 파일 이동
			file.transferTo(copyFile);
			// 상세보기용 이미지 리사이징&업로드
			r_img_new = resizeImg(tempPath, newFileName, 550, 360, "new");
			// 섬네일용 이미지 리사이징&업로드
			r_img_thum = resizeImg(tempPath, newFileName, 150, 100, "thum");

		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		HashMap<String, String> map = new HashMap<String, String>();
		map.put("r_img_new", r_img_new); // 상세보기 이미지
		map.put("r_img_thum", r_img_thum); // 섬네일 이미지
		map.put("r_img_origin", newFileName); // 원본 이미지
		map.put("fileName", r_img_origin); // 원본 이미지(변경 후)
		return new ModelAndView("recipe/imgPopup", "map", map);
	}// tempFileUpload

	public ModelAndView getContent(HttpServletRequest request,
			HttpServletResponse response, HttpSession session, FavoriteVO fvo) throws SQLException {
		String no = request.getParameter("r_no");
		String id= request.getParameter("m_id");
		String page = request.getParameter("page");
		String path = "";
		boolean favorite_flag=false;
		//조회수 업데이트 구현
		String user_id=null;
		boolean flag=false;
		//
		if(session.getAttribute("loginMember")!=null){
		HashMap user_map=(HashMap) session.getAttribute("loginMember");
		MemberVO mvo=(MemberVO)user_map.get("mvoLogin");
		user_id=mvo.getM_id();
		}else{
			flag=true;
		}
		//r_no가 null이 아닌경우 -> 썸네일 리스트에서 누르고 들어온 경우임
		if (no != null) {
			int r_no = Integer.parseInt(no);
			HashMap hmap=new HashMap();
			hmap.put("content_id", id);
			hmap.put("r_no", r_no);
			hmap.put("user_id",user_id);
			hmap.put("flag", flag);
				try {
				Map map = service.getContent(hmap);
				session.setAttribute("recipeContent", map);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		//r_no가 null인 경우 -> 레시피 보기 1~4 안에서 이동하는 경우 	r_no를 가져온다
		}else{
			HashMap r_map=(HashMap)session.getAttribute("recipeContent");
			RecipeVO rvo=(RecipeVO)r_map.get("rvo");
			no=Integer.toString(rvo.getR_no());
		}
		
		//1~4페이지에서 앞으로 가기 뒤로 가기 버튼을 두를 때 페이지를 이동시키기 위한 코딩
		if ("1".equals(page)) {
			path = "content1.reply";
			//즐겨찾기 추가-로그인한 사용자가 즐겨찾기를 했는지 유무 판단
			if(session.getAttribute("loginMember")!=null){
				fvo.setM_id(user_id);
				fvo.setR_no(Integer.parseInt(no));
				favorite_flag=service.isFavorite(fvo);
				request.setAttribute("favorite_flag", favorite_flag);
			}else{
				request.setAttribute("favorite_flag", false);
			}
		} else if ("2".equals(page)) {
			path = "content2.reply";
		} else if ("3".equals(page)) {
			path = "content3.reply";
		} else if ("4".equals(page)) {
			path = "content4.reply";
			reviewOrder = 1;
			Map map = (Map) session.getAttribute("recipeContent");
			List list = (List) map.get("list");
			request.setAttribute("orderSize", list.size());
			request.setAttribute("reviewOrder", reviewOrder);
		}
		//레시피 보기에서 댓글보기 창이 열려있는지 닫혀있는지 확인하는 메서드
		String reply_flag=request.getParameter("reply_flag");
		request.setAttribute("reply_flag",reply_flag);
		
			//댓글 리스트를 불러온다.
			getRecipeReplyList(request,no);
		
		
		return new ModelAndView(path);
	}

	int reviewOrder = 1;

	public ModelAndView getDescContent(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)  throws SQLException{
		if ("next".equals(request.getParameter("page"))) {
			reviewOrder++;
		} else if ("prev".equals(request.getParameter("page"))) {
			reviewOrder--;
		}
		//댓글이 열려있는지 닫혀있는지 확인 
		String reply_flag=request.getParameter("reply_flag");
		request.setAttribute("reply_flag",reply_flag);
		 
			//reviewOrder와 orderSize를 이용해 마지막 페이지를 구별한다.
			 HashMap r_map=(HashMap)session.getAttribute("recipeContent");
			 List list = (List) r_map.get("list");
			 request.setAttribute("orderSize", list.size());
			 //댓글리스트를 불러오기위한 과정
			 RecipeVO rvo=(RecipeVO)r_map.get("rvo");
			 String no=Integer.toString(rvo.getR_no());
			 //댓글 리스트를 불러온다.
			getRecipeReplyList(request,no);
		 
		return new ModelAndView("content4.reply", "reviewOrder", reviewOrder);
	}

	//페이지 이전으로 갈시에 사용하는 메서드
		public ModelAndView update_move(HttpServletRequest request,
				   HttpServletResponse response,HttpSession session) {
				  String path = "";
				  //레시피 몇페이지에 해당하는지 확인하는 parameter값.
				  String page = request.getParameter("page");
				  if ("1".equals(page)) {
				   Map map=(Map) session.getAttribute("recipeContent");
				   RecipeVO vo=(RecipeVO) map.get("rvo");
				   String imgFile=vo.getR_img_new();
				   File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgFile);
				   //임시파일에 파일이 있는지 존재여부 확인
				   if(f.isFile()){
				    request.setAttribute("modify", "수정");
				   }
				   path = "update1.recipe";
				  } else if ("2".equals(page)) {
				   path = "update2.recipe";
				  } else if ("3".equals(page)) {
				   path = "update3.recipe";
				  }	else if ("4".equals(page)) {
					   path = "update4.recipe";
				  }
				  return new ModelAndView(path, "reviewOrder", reviewOrder);
	}
		//다음 버튼을 눌렀을 때 실행되는 것(1~3페이지)
		public ModelAndView update(HttpServletRequest request,
				HttpServletResponse response) {
			//임시저장시 update 메서드에 접근하기 때문에 session을 인자값으로 받지 않고, 따로 받음
			HttpSession session=request.getSession(); 
			String path = "";
			String page = request.getParameter("page"); //레시피 몇페이지에 해당하는지 확인하는 parameter값.
			Map map = (Map) session.getAttribute("recipeContent");
			RecipeVO vo = (RecipeVO) map.get("rvo");
			if ("2".equals(page)) {
				String r_title = request.getParameter("r_title");
				String r_comment = request.getParameter("r_comment");
				String r_img_origin = request.getParameter("r_img_origin");
				String r_img_new = request.getParameter("r_img_new");
				String r_img_thum = request.getParameter("r_img_thum");
				vo.setR_title(r_title);
				vo.setR_comment(r_comment);
				vo.setR_img_origin(r_img_origin);
				vo.setR_img_new(r_img_new);
				vo.setR_img_thum(r_img_thum);
				path = "update2.recipe";
			} else if ("3".equals(page)) {
				String r_category = request.getParameter("r_category");
				String r_nara = request.getParameter("r_nara");
				vo.setR_type(r_category + r_nara);
				path = "update3.recipe";
			} else if ("4".equals(page)) {
				int r_mcnt = Integer.parseInt(request.getParameter("r_mcnt"));
				String r_main_ingre = request.getParameter("r_main_ingre");
				String r_sub_ingre = request.getParameter("r_sub_ingre");
				vo.setR_mcnt(r_mcnt);
				vo.setR_main_ingre(r_main_ingre);
				vo.setR_sub_ingre(r_sub_ingre);
				reviewOrder = 1; //4페이지에 처음 보낼때 reviewOrder을 1로 setting
				//3->4페이지(처음 상세 레시피)로 갈때 리스트 뿌려주기 위함.
				List list = (List) map.get("list");
		
				request.setAttribute("orderSize", list.size());
				request.setAttribute("reviewOrder", reviewOrder);
				path = "update4.recipe";
				
			}
			return new ModelAndView(path);
		}
		//다음 버튼 눌렀을 때 실행되는 메서드(4페이지 반복)
		public ModelAndView updateDesc(HttpServletRequest request,
				HttpServletResponse response) {
			String path = "";
			HttpSession session=request.getSession();
			if ("next".equals(request.getParameter("page"))) {
				Map map = (Map) session.getAttribute("recipeContent");
				List list = (List) map.get("list");
				request.setAttribute("orderSize", list.size()); //마지막 페이지인지 아닌지 확인하기 위해서 사용.
				reviewOrder++;
				//임시저장 후에 이전 으로 갔다가 다시 다음 버튼 눌렀을 시 임시로 저장해논 값 출력하기 위한 작업.
				RecipeDescVO rdvo=(RecipeDescVO) list.get(reviewOrder-1);
				String imgDesc=rdvo.getR_img_new();
				File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgDesc);
				if(f.isFile()){
					request.setAttribute("modify", "수정");
				}
			} else if ("prev".equals(request.getParameter("page"))) {
				reviewOrder--;
				
				//임시저장 후에 다음 갔다가 이전으로 갈 시에 임시로 저장해논 값 출력하기 위한 작업.
				Map map = (Map) session.getAttribute("recipeContent");
				List list = (List) map.get("list");
				RecipeDescVO rdvo=(RecipeDescVO) list.get(reviewOrder-1);
				String imgDesc=rdvo.getR_img_new();
				File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgDesc);
				if(f.isFile()){
					request.setAttribute("modify", "수정");
				}
			}
			return new ModelAndView("update4.recipe", "reviewOrder", reviewOrder);
		}
		//수정 버튼 눌렀을 시 사용.
		public ModelAndView update_submit(HttpServletRequest request,
				HttpServletResponse response, HttpSession session) throws SQLException, IllegalStateException, IOException {
			//수정할 레시피를 session에서 가져옴.
			Map map = (Map) session.getAttribute("recipeContent");
			RecipeVO vo = (RecipeVO) map.get("rvo");
			List list = (List) map.get("list");
			service.update(vo, list,pluspage); //추가된 페이지가 몇장인지도 보내줌.
				
				// 이미지 저장 폴더로 이동
				moveFile(session, vo.getR_img_new());
				moveFile(session, vo.getR_img_thum());
				moveFile(session, vo.getR_img_origin());
				for (int i = 0; i < list.size(); i++) {
					RecipeDescVO rvo = (RecipeDescVO) list.get(i);
					moveFile(session, rvo.getR_img_new());
					moveFile(session, rvo.getR_img_thum());
					moveFile(session, rvo.getR_img_origin());
				}
				pluspage=0; //수정 후에는 다시 추가페이지수를 0으로 setting해줌
			return new ModelAndView("redirect:/index.jsp");
		}
		//임시저장 버튼
		public ModelAndView temSave(HttpServletRequest request,HttpServletResponse response,HttpSession session){
			String path="";
			String page=request.getParameter("page");
		if("2".equals(page)){
			update(request,response); //기존 recipeVO에 set해줌
			Map map=(Map) session.getAttribute("recipeContent");
			RecipeVO vo=(RecipeVO) map.get("rvo");
			String imgFile=vo.getR_img_new();
			File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgFile);
			if(f.isFile()){
				request.setAttribute("modify", "수정");
			}
			path="update1.recipe";
		}else if("3".equals(page)){
			update(request,response);
			path="update2.recipe";
		}else if("4".equals(page)){
			update(request,response);
			path="update3.recipe";
		}else if("next".equals(page)){
			//상세요리 임시저장.
			Map map = (Map) session.getAttribute("recipeContent");
			List list = (List) map.get("list");
			RecipeDescVO rdvo = (RecipeDescVO) list.get(reviewOrder-1);
			String r_subject = request.getParameter("r_subject");
			String r_content = request.getParameter("r_content");
			String r_img_origin = request.getParameter("r_img_origin");
			String r_img_new = request.getParameter("r_img_new");
			String r_img_thum = request.getParameter("r_img_thum");
			rdvo.setR_subject(r_subject);
			rdvo.setR_content(r_content);
			rdvo.setR_img_origin(r_img_origin);
			rdvo.setR_img_new(r_img_new);
			rdvo.setR_img_thum(r_img_thum);
			list.set(reviewOrder-1, rdvo); //가져온 recipeDescVO 에 다시 set해줌
			request.setAttribute("orderSize", list.size());
			
			//상세요리 등록후의 사진뿌려주기.
			String imgDesc=rdvo.getR_img_new();
			File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgDesc);
			if(f.isFile()){
				request.setAttribute("modify", "수정");
			}
			path="update4.recipe";
		}
			request.setAttribute("temSaveIs", "임시저장");
			return new ModelAndView(path,"reviewOrder", reviewOrder);
		}
		
		public ModelAndView update_plus(HttpServletRequest request,HttpServletResponse Response,HttpSession session){
			reviewOrder++; //기존 저장되어있는 레시피에서 더 추가하고 싶을시에 reviewOrder을 ++시켜서 다음페이지에 넘겨줌.
			return new ModelAndView("updateWrite.recipe","reviewOrder",reviewOrder);
		}
		
		int pluspage=0;  //새로 추가되는 페이지가 몇장인지 세는 변수
		public ModelAndView temSavePlus(HttpServletRequest request,HttpServletResponse response,HttpSession session){
			Map map=(Map) session.getAttribute("recipeContent");
			RecipeVO rvo=(RecipeVO) map.get("rvo");
			List list=(List) map.get("list");
			RecipeDescVO rdvo = null;
			//현재의 오더를 받아오는 메서드
			int updateOrder=Integer.parseInt(request.getParameter("updateOrder"));
			//현재의 오더와 기존 리스트에있는 레시피 오더수가 동일한지 비교,
				if(updateOrder==list.size()){ //동일하다면 기존에 있는 레시피에서 오더를 찾아 업데이트 해줌.
					rdvo = (RecipeDescVO) list.get(reviewOrder-1);
					String r_subject = request.getParameter("r_subject");
					String r_content = request.getParameter("r_content");
					String r_img_origin = request.getParameter("r_img_origin");
					String r_img_new = request.getParameter("r_img_new");
					String r_img_thum = request.getParameter("r_img_thum");
					rdvo.setR_subject(r_subject);
					rdvo.setR_content(r_content);
					rdvo.setR_img_origin(r_img_origin);
					rdvo.setR_img_new(r_img_new);
					rdvo.setR_img_thum(r_img_thum);
					list.set(reviewOrder-1, rdvo);
					request.setAttribute("orderSize", list.size());
				}else{//갖지 않다면 새로 레시피를 생성해준다.			
					rdvo = new RecipeDescVO();
					// recipeDescVO 값 setting
					rdvo.setR_order(reviewOrder);
					rdvo.setR_no(rvo.getR_no());
					rdvo.setR_subject(request.getParameter("r_subject"));
					rdvo.setR_content(request.getParameter("r_content"));
					
					rdvo.setR_img_origin(request.getParameter("r_img_origin"));
					rdvo.setR_img_new(request.getParameter("r_img_new"));
					rdvo.setR_img_thum(request.getParameter("r_img_thum"));
					// recipeDescVO 를 List에 담아 session에 저장한다.
					list.add(rdvo);
					pluspage++; //새로 페이지를 추가시엔 ++해줌.
					request.setAttribute("pluspage", pluspage);
					
					//상세요리 등록후의 사진뿌려주기.
					String imgDesc=rdvo.getR_img_new();
					File f = new File("C:\\java-ohbu\\server\\ohbu-tomcat\\webapps\\ohbu\\upload\\temp\\"+imgDesc);
					if(f.isFile()){
						request.setAttribute("modify", "수정");
					}				
				}
				request.setAttribute("orderSize", list.size()); //앞뒤로 페이지 넘기는 것을 위해 리스트 사이즈를 넘겨줌.
				request.setAttribute("temSaveIs", "임시저장"); //임시저장 되었는지 확인하기위해 request 보냄.
				request.setAttribute("updatePlus", "새로운페이지"); //새로운 페이지 인지 확인하기 위해 보냄. -> 임시저장 후 세션에 있는 사진을 보여주기 위함.
			return new ModelAndView("updateWrite.recipe","reviewOrder",reviewOrder);
		}
	
		//레시피 삭제
		public ModelAndView delete(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws SQLException{
			  String no=request.getParameter("r_no");
			  int r_no=Integer.parseInt(no);
			  //게시물 즐겨찾기 삭제
			  service.favoriteDelete(r_no);
			  //게시물 평점 삭제
			  service.gradeDelete(r_no);
			  //게시물 댓글 삭제
			  service.replyDelete(r_no);
			  //게시물 삭제
			  service.delete(r_no);
			  //랭킹 목록 삭제
			  service.rankingDelete(r_no);
			  
			  Map map=(Map) session.getAttribute("recipeContent");
			  RecipeVO vo=(RecipeVO) map.get("rvo");
			  List list=(List) map.get("list");
			  //게시물 삭제시 이미지도 같이 지워준다.
			  deleteImg(vo.getR_img_new());
			  deleteImg(vo.getR_img_thum());
			  deleteImg(vo.getR_img_origin());
			  for(int i=0;i<list.size();i++){
			   RecipeDescVO rvo = (RecipeDescVO)list.get(i);
			   deleteImg(rvo.getR_img_new());
			   deleteImg(rvo.getR_img_thum());
			   deleteImg(rvo.getR_img_origin());
			   }
			  
			  String page="1";
			  ListVO listvo=service.userListByRecipe(page);
			  return new ModelAndView("userList.recipe","userListByRecipe",listvo);
			 }
		//사진 지우는 메서드
		public void deleteImg(String fileName){
			  File file = new File(imgPath+File.separator+fileName);
			  file.delete();
			 }	
			 	
	// 로고 클릭시에 - 관리자의 최신 게시물과 , 조회순위 상위 10개의 게시물 정보를 가져온다	
	public ModelAndView getTodayCook(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)
			throws SQLException {
		String today = request.getParameter("today");
		String page = request.getParameter("page");
		String path = "";
		Map map = null;
		ArrayList valueList = new ArrayList();
		ArrayList viewList = new ArrayList();
		SimpleDateFormat valueFormat = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat viewFormat = new SimpleDateFormat("MM월dd일");
		//최초 index.jsp로 접근시 session에 헤더탭 날짜를 공유한다.
		if ("today".equals(today)) {
			for (int i = 0; i < 7; i++) {
				viewList.add(viewFormat.format(new Date().getTime()- ((long) 1000 * 60 * 60 * 24) * i));
				valueList.add(valueFormat.format(new Date().getTime()- ((long) 1000 * 60 * 60 * 24) * i));
				session.setAttribute("value", valueList);
				session.setAttribute("view", viewList);		//session에 날짜를 공유한다.
		}
	}
		//최초 접근시 동작 (홈버튼 누를시) ;  넘어온 초기 값은 null이므로 page setting
		if (page == null) {
			path = "today1.today";
				try {
					// 처음 메인 화면에 접근시- 관리자의 최신 게시물과 , 조회순위 상위 10개의 게시물 정보를 가져온다	
					map = service.getTodayCook();  
				} catch (NotFoundRecipeException e) {
					return new ModelAndView("notfoundpage.error"); //게시물이 없을시 에러
				}
			//map.put("content_reply", "true");
			//레시피보기에 필요한 자료를 session에 공유
			session.setAttribute("recipeContent", map);
			//즐겨 찾기 유무
			if(session.getAttribute("loginMember")!=null){
				HashMap user_map=(HashMap) session.getAttribute("loginMember");
				MemberVO mvo=(MemberVO)user_map.get("mvoLogin");
				map=(HashMap)session.getAttribute("recipeContent");
				RecipeVO rvo=(RecipeVO)map.get("rvo");
				FavoriteVO fvo=new FavoriteVO();
				fvo.setM_id(mvo.getM_id());
				fvo.setR_no(rvo.getR_no());
				boolean favorite_flag=service.isFavorite(fvo);
				request.setAttribute("favorite_flag", favorite_flag);
			}else{
				request.setAttribute("favorite_flag", false);
			}
		}else	if ("1".equals(page)) {
			path = "today1.today";
			//즐겨 찾기 유무
			if(session.getAttribute("loginMember")!=null){
				HashMap user_map=(HashMap) session.getAttribute("loginMember");
				MemberVO mvo=(MemberVO)user_map.get("mvoLogin");
				map=(HashMap)session.getAttribute("recipeContent");
				RecipeVO rvo=(RecipeVO)map.get("rvo");
				FavoriteVO fvo=new FavoriteVO();
				fvo.setM_id(mvo.getM_id());
				fvo.setR_no(rvo.getR_no());
				boolean favorite_flag=service.isFavorite(fvo);
				request.setAttribute("favorite_flag", favorite_flag);
			}else{
				request.setAttribute("favorite_flag", false);
			}
		} else if ("2".equals(page)) {
			path = "today2.today";
		} else if ("3".equals(page)) {
			path = "today3.today";
		} else if ("4".equals(page)) {
			path = "today4.today";
			reviewOrder = 1;
			map = (HashMap) session.getAttribute("recipeContent");
			List list = (List) map.get("list");
			request.setAttribute("orderSize", list.size());
			request.setAttribute("reviewOrder", reviewOrder);
		}
		//레시피 보기에서 댓글보기 창이 열려있는지 닫혀있는지 확인하는 메서드
		String reply_flag=request.getParameter("reply_flag");
		request.setAttribute("reply_flag",reply_flag);
		//댓글 리스트를 불러온다.
		map=(HashMap)session.getAttribute("recipeContent");
		RecipeVO rvo=(RecipeVO)map.get("rvo");
		String no=Integer.toString(rvo.getR_no());
		getRecipeReplyList(request,no);
		
		return new ModelAndView(path);
	}
	
	// 오늘의 메뉴 보기 날짜 버튼에 따라서 맞는 날짜를 뿌려준다
	public ModelAndView today(HttpServletRequest request,HttpServletResponse response, HttpSession session)	throws SQLException {
		String date = request.getParameter("date");
		ModelAndView mv = null;
		RecipeVO vo = new RecipeVO();

		//최초에는 날짜의 정보가 없다.
		if (date == null) {
			SimpleDateFormat valueFormat = new SimpleDateFormat("yyyy-MM-dd");
			String r_date = valueFormat.format(new Date().getTime()); //오늘날짜조회
			vo.setR_date(r_date);
			mv = getAnotherDayCook(request, response, session, vo);
		}
		//날짜를 직접 검색시 동작
		if (date != null) {
			vo.setR_date(date);
			mv = getAnotherDayCook(request, response, session, vo);
		}
		return mv;
	}
	//today에서 사용하는 메서드
	public ModelAndView getAnotherDayCook(HttpServletRequest request,
			HttpServletResponse response, HttpSession session, RecipeVO vo)
			throws SQLException {
		HashMap map = null;
		try {
			map = service.getAnotherDayCook(vo.getR_date());
		} catch (NotFoundRecipeException e) {
			request.setAttribute("date", vo.getR_date());
			return new ModelAndView("notfoundpage.error");
		}
		//이거 뭐지?
		//map.put("content_reply", "true");
		session.setAttribute("recipeContent", map);  //레시피 보기 자료 뽑아옴
		//댓글 리스트를 불러온다.
		RecipeVO rvo=(RecipeVO)map.get("rvo");
		String no=Integer.toString(rvo.getR_no());
		getRecipeReplyList(request,no);
		//즐겨 찾기 유무
		if(session.getAttribute("loginMember")!=null){
			HashMap user_map=(HashMap) session.getAttribute("loginMember");
			MemberVO mvo=(MemberVO)user_map.get("mvoLogin");
			vo=(RecipeVO)map.get("rvo");
			FavoriteVO fvo=new FavoriteVO();
			fvo.setM_id(mvo.getM_id());
			fvo.setR_no(rvo.getR_no());
			boolean favorite_flag=service.isFavorite(fvo);
			request.setAttribute("favorite_flag", favorite_flag);
		}else{
			request.setAttribute("favorite_flag", false);
		}
		return new ModelAndView("today1.today");
	}
	//today와 anotherday 공유
	public ModelAndView getAnotherAndTodayDescContent(HttpServletRequest request,HttpServletResponse response, HttpSession session) throws SQLException {
			if ("next".equals(request.getParameter("page"))) {
				reviewOrder++;
			} else if ("prev".equals(request.getParameter("page"))) {
				reviewOrder--;
			}
			//댓글이 열려있는지 닫혀있는지 확인 
			String reply_flag=request.getParameter("reply_flag");
			request.setAttribute("reply_flag",reply_flag);
			
			Map map = (Map) session.getAttribute("recipeContent");
			List list = (List) map.get("list");
			request.setAttribute("orderSize", list.size());
			
			//댓글리스트를 불러오기위한 과정
			 RecipeVO rvo=(RecipeVO)map.get("rvo");
			 String no=Integer.toString(rvo.getR_no());
			 //댓글 리스트를 불러온다.
			getRecipeReplyList(request,no);
		
			return new ModelAndView("today4.today", "reviewOrder", reviewOrder);
		}

	/**
	 * 즐겨찾기 상단 탭 화면
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException 
	 * @throws Exception
	 */
	public ModelAndView favorite(HttpServletRequest request, HttpServletResponse response,HttpSession session) throws SQLException {
		HashMap map=(HashMap)session.getAttribute("loginMember");
		if(map==null){
			return new ModelAndView("loginerror.error");
		}
		MemberVO mvo=(MemberVO) map.get("mvoLogin");
		List	list = service.favorite(mvo.getM_id());
		return new ModelAndView("favorite.member","list",list);
}
	/**
	 * 즐겨찾기 추가 버튼
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException 
	 * @throws Exception
	 * 즐겨찾기 추가 버튼
	 */
	public ModelAndView addFavorite(HttpServletRequest request, HttpServletResponse response,HttpSession session,FavoriteVO vo) throws SQLException {

		 MemberVO mvo=null;
		 String r_no=request.getParameter("r_no");
		 vo.setR_no(Integer.parseInt(r_no));
		 if(session.getAttribute("loginMember")!=null){
             HashMap hmap=(HashMap) session.getAttribute("loginMember");
             mvo=(MemberVO) hmap.get("mvoLogin");
		 }
		 vo.setM_id(mvo.getM_id());
		service.addFavorite(vo);
		
		request.setAttribute("reply_flag",request.getParameter("reply_flag"));// 현재 댓글이 열렸는지 닫혔는지 판단
		getRecipeReplyList(request,r_no);//답글리스트
		return new ModelAndView("content1.reply","favorite_flag", "true");
}
	/**
	 * 즐겨찾기 삭제
	 * @param request
	 * @param response
	 * @param session
	 * @return
	 * @throws SQLException
	 */
	public ModelAndView deleteFavorite(HttpServletRequest request, HttpServletResponse response,HttpSession session,FavoriteVO vo) throws SQLException {
		String r_no=request.getParameter("r_no");
		MemberVO mvo=null;
        if(session.getAttribute("loginMember")!=null){
                HashMap hmap=(HashMap) session.getAttribute("loginMember");
                mvo=(MemberVO) hmap.get("mvoLogin");
        }
        vo.setM_id(mvo.getM_id());
		
		service.deleteFavorite(vo);
		//해더탭에서 삭제할 경우
		String page=request.getParameter("page");
		if("header".equals(page)){
			ModelAndView mv=favorite(request, response, session);
            return mv;
		}
		//게시물 첫페이지에서 삭제 할 경우
		request.setAttribute("reply_flag",request.getParameter("reply_flag"));// 현재 댓글이 열렸는지 닫혔는지 판단
		getRecipeReplyList(request,r_no);//답글리스트
		return new ModelAndView("content1.reply","favorite_flag", "false");
}

	// 레시피 평점 등록 	
	public ModelAndView recipeGrade(HttpServletRequest request,HttpServletResponse response,HttpSession session,RecipeGradeVO rgvo) throws SQLException{
		String path="";
		String page=request.getParameter("page");
		//답글 리스트 불러오기
		HashMap r_map=(HashMap)session.getAttribute("recipeContent");
		RecipeVO rvo=(RecipeVO)r_map.get("rvo");
		String no=Integer.toString(rvo.getR_no());
		getRecipeReplyList(request,no);
		
		if ("1".equals(page)) {
			path = "content1.reply";
			//즐겨찾기 등록유무
			FavoriteVO fvo=new FavoriteVO();
			fvo.setM_id(rgvo.getM_id());
			fvo.setR_no(rgvo.getR_no());
			boolean favorite_flag=service.isFavorite(fvo);
			request.setAttribute("favorite_flag", favorite_flag);
		} else if ("2".equals(page)) {
			path = "content2.reply";
		} else if ("3".equals(page)) {
			path = "content3.reply";
		} else if ("next".equals(page)) {
			path = "content4.reply";
			List list = (List) r_map.get("list");
			request.setAttribute("orderSize", list.size());
		}
		boolean replyTxt=true;
		boolean flag=service.isRate(rgvo);
		//false이면 작성자가 이 게시물에 처음 평점등록 하는 상태임
		if(!flag){
			service.registerGrade(rgvo);
			service.updateRecipeGrade(rgvo);
			replyTxt=false;
			rvo.getR_gcnt();
			rvo.getR_totalGrade();
			//service.getGrade();
			
			int gcnt=rvo.getR_gcnt()+1;
			float rgrade= rgvo.getR_grade()+rvo.getR_totalGrade();
			rvo.setR_gcnt(gcnt);
			rvo.setR_grade(rgrade);
			r_map.put("rvo", rvo);
			session.setAttribute("recipeContent", r_map);
		}
		request.setAttribute("reply_flag","true");
		request.setAttribute("replyTxt", replyTxt);
		return new ModelAndView(path,"reviewOrder", reviewOrder);
	}
	
	//레시피 답글 등록
	public ModelAndView recipeReply(HttpServletRequest request, HttpServletResponse response,HttpSession session, RecipeReplyVO rrvo) throws SQLException{
		// 리로딩시 현재 자신의 페이지로 돌아가기위해 설정
		String path="";
		String page=request.getParameter("rpage");
		HashMap r_map=(HashMap)session.getAttribute("recipeContent");
		RecipeVO rvo=(RecipeVO)r_map.get("rvo");

		if ("1".equals(page)) {
			path = "content1.reply";
			//즐겨찾기 등록유무
			FavoriteVO fvo=new FavoriteVO();
			fvo.setM_id(rvo.getM_id());
			fvo.setR_no(rvo.getR_no());
			boolean favorite_flag=service.isFavorite(fvo);
			request.setAttribute("favorite_flag", favorite_flag);
		} else if ("2".equals(page)) {
			path = "content2.reply";
		} else if ("3".equals(page)) {
			path = "content3.reply";
		} else if ("next".equals(page)) {
			path = "content4.reply";
			List list = (List) r_map.get("list");
			request.setAttribute("orderSize", list.size());
		}
		//현재 댓글을 작성했으므로 댓글창을 무조건 열어준다.
		request.setAttribute("reply_flag","true");
		//recipeReplyVO 에 셋팅해준다.
		String rep_content=request.getParameter("rep_content");
		rrvo.setRep_content(rep_content);
		rrvo.setR_no(rvo.getR_no());
		HashMap m_map=(HashMap)session.getAttribute("loginMember");
		MemberVO mvo= (MemberVO) m_map.get("mvoLogin");
		rrvo.setM_id(mvo.getM_id());
		rrvo.setM_name(mvo.getM_name());
		rrvo.setM_type(mvo.getM_type());
		//글작성
		service.writeReply(rrvo);
		//답글 리스트 불러오기
		String no=Integer.toString(rvo.getR_no());
		getRecipeReplyList(request,no);
		
		return new ModelAndView(path,"reviewOrder", reviewOrder);
	}
	//레시피 답글 삭제
	public ModelAndView deleteReply(HttpServletRequest request, HttpServletResponse response,HttpSession session, RecipeReplyVO rrvo) throws SQLException{
		// 리로딩시 현재 자신의 페이지로 돌아가기위해 설정
		String path="";
		String page=request.getParameter("rpage");
		//현재 로그인한사람 다시 뽑아줌 .. 페이지 리로딩시 정보 필요해서 ..현재 관리자인지 사용자인지 모르기 때문에
		HashMap r_map=(HashMap)session.getAttribute("recipeContent");
		RecipeVO rvo=(RecipeVO)r_map.get("rvo");
		if ("1".equals(page)) {
			path = "content1.reply";
			//즐겨찾기 등록유무
			FavoriteVO fvo=new FavoriteVO();
			fvo.setM_id(rvo.getM_id());
			fvo.setR_no(rvo.getR_no());
			boolean favorite_flag=service.isFavorite(fvo);
			request.setAttribute("favorite_flag", favorite_flag);
		} else if ("2".equals(page)) {
			path = "content2.reply";
		} else if ("3".equals(page)) {
			path = "content3.reply";
		} else if ("next".equals(page)) {
			path = "content4.reply";
			List list = (List) r_map.get("list");
			request.setAttribute("orderSize", list.size());
		}
		//현재 댓글을 삭제했으므로 댓글창을 무조건 열어준다.
		request.setAttribute("reply_flag","true");
		//글 삭제 rep_no,m_id
		service.deleteReply(rrvo);
		//답글 리스트 불러오기
		String no=Integer.toString(rvo.getR_no());
		getRecipeReplyList(request,no);
		return new ModelAndView(path,"reviewOrder", reviewOrder);
	}
	
	//레시피 답글 리스트 recipeReply,recipeGrade에서 사용
	public void getRecipeReplyList(HttpServletRequest request,String no) throws SQLException{
		Reply_ListVO replyList= service.getRecipeReplyList(no,request.getParameter("pageNo"));
		request.setAttribute("replyList", replyList);
	}
	
	//레시피 답글 작성시 리스트 페이징
	public ModelAndView getRecipeReplyListPageing(HttpServletRequest request,HttpServletResponse response,HttpSession session) throws SQLException{
		// 리로딩시 현재 자신의 페이지로 돌아가기위해 설정
		String path="";
		String page=request.getParameter("page");
		HashMap r_map=(HashMap)session.getAttribute("recipeContent");

		if ("1".equals(page)) {
			path = "content1.reply";
		} else if ("2".equals(page)) {
			path = "content2.reply";
		} else if ("3".equals(page)) {
			path = "content3.reply";
		} else if ("next".equals(page)) {
			path = "content4.reply";
			List list = (List) r_map.get("list");
			request.setAttribute("orderSize", list.size());
		}
		request.setAttribute("reply_flag","true");
		request.setAttribute("reviewOrder", reviewOrder);
		//페이징 구현
		RecipeVO rvo=(RecipeVO)r_map.get("rvo");
		String no=Integer.toString(rvo.getR_no());
		
		Reply_ListVO replyList=service.getRecipeReplyList(no,request.getParameter("pageNo"));
		
		return new ModelAndView(path,"replyList",replyList);
	}
	//나의 레시피보기
	public ModelAndView getMyRecipe(HttpServletRequest request,
			HttpServletResponse response,HttpSession session) throws SQLException {
		String page = request.getParameter("pageNo");
		HashMap map=(HashMap)session.getAttribute("loginMember");
		MemberVO vo=(MemberVO)map.get("mvoLogin");
		HashMap user_map=new HashMap();
		user_map.put("page", page);
		user_map.put("rownum", CommonConstants.CONTENT_NUMBER_PER_PAGE);
		user_map.put("m_id",vo.getM_id());
		user_map.put("r_user", vo.getM_type());
		
		ListVO listvo = (ListVO) service.getMyRecipe(user_map);
		return new ModelAndView("myRecipe.member", "myRecipe", listvo);
	}
	public ModelAndView bbomList(HttpServletRequest request,
			HttpServletResponse response, HttpSession session)
			throws SQLException {
		String page = request.getParameter("pageNo");//입력받은 페이지번호
		ListVO listvo = service.userListByRecipe(page);
		return new ModelAndView("userList.recipe", "userListByRecipe", listvo);
	}

}
